iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
自我挑戰組

React Clean Code And Unit Tests - 利用測試寫出人類看得懂的React程式系列 第 8

Day 8 - 什麼時候該寫單元測試 & Jest 語法

  • 分享至 

  • xImage
  •  

我們什麼時候該做單元測試

  • 以TDD開發的話,那你應該會在寫任何一個function的時候就先把測試寫下來
  • 商業邏輯複雜時
  • 多人開發時
  • 會因為狀態改變而呈現不同 UI 的 component
  • 可以寫測試的就寫吧

簡單來說,當你的測試寫得越多,覆蓋率越高,就可以相信你的專案遇到921大地震也扛的住。

Jest 常用語法

  1. 基本使用

    • describe() → 同概念 case 的組合
    • test() / it() → 要測試的case
    • expect() → 建立斷言(assertions)

    使用 it() 或 test() 函式,並在參數中放入該測試的名稱和程式碼。簡單的測試大概就像這樣,其實就很像在講英文一樣,只是中間多了很多符號而已 。

    describe('Test', () => {
      test('true is true', () => {
        expect(true).toBe(true);
      });
    });
    
  2. 常用語法 可以參考 Jest

    • 判斷是否相同

      • toBe → 使用 Object js 來比對
      • toEqual() → 比對物件內容是否相同
    • 判斷布林與存在

      • toBeTruthy()
      • toBeFalsy()
      • toUndefined()
      • toBeNull → 其實等於 toBe(null)
    • Mock Functions

      • jest.fn() → 模擬function ,預設會回傳 undefined ,所以在使用時要去定義你要回傳什麼
      • jest.spyOn() → 跟 jest.fn() 相似都可以模擬函式,但不同的是 spyOn 會真的去執行該函式
      const mock = jest.fn()
      console.log(mock()) // 回傳 undefined
      
      mock.mockReturnValue(42); // 回傳 42
      
      mock.mockReturnValueOnce(10).mockReturnValueOnce('x').mockReturnValue(true); 
      console.log(mock(), mock(), mock()) // 10 ,x ,true
      
      
    • Mocking Modules

      • jest.mock() → 模擬模組,例如可以拿來模擬axios框架

        用法 : jest.mock(moduleName 模組名稱 , factory 要執行的程式, options 其他設定) , 其中 factory 跟 options 是 optional 的

      
      import axios from 'axios';
      import Users from './users';
      
      // mock axios 模組
      jest.mock('axios');
      test('should fetch users', () => {
        const users = [{name: 'Dylan'}];
        const response = {data: users};
        // 設定get時要回傳的值
        axios.get.mockResolvedValue(response );
        return Users.all().then(data => expect(data).toEqual(users));
      });
      

感覺還有很多東西沒有提到,沒提到的之後寫測試時就邊寫邊補充吧 !


上一篇
Day 7 - 專案建置 & Jest環境設定
下一篇
Day 9 - React Hooks 測試 part 1
系列文
React Clean Code And Unit Tests - 利用測試寫出人類看得懂的React程式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言